package springmvc.output.controller;

import jakarta.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * description: 前端响应
 * TODO：1）Handler方法根据指定路径的前后缀匹配视图JSP文件 2） 转发与重定向
 *
 * 1）Handler 方法根据指定路径的前后缀匹配视图JSP文件
 * 1. 方法的返回值是字符串类型，返回值为对应视图文件的名称，前后缀路径信息在MvcConfig中已经指定
 * 2. 方法不能添加@ResponseBody，否则会直接返回给字符串给浏览器，不找视图，不走视图解析器
 * 3. 方法添加前端路径映射 @GetMapping("")
 * 4. 在 request 共享域中添加数据，用于jsp文件动态获取
 *
 * 2） 转发
 * 1. 方法返回值类型是字符串，返回新的访问路径
 * 2. 返回值通过 forward:/转发地址 前缀表示进行转发，否则默认返回的是视图文件
 * 3. 不能添加@ResponseBody
 * 4. 转发只能是项目下的资源，返回的转发路径可以忽略Tomcat部署配置的Application Context(/springmvc)，直接返回  /jsp/index
 *
 * 3） 重定向
 * 1. 方法返回值类型是字符串，返回新的访问路径
 * 2. 返回值通过 redirect/重定向的地址 前缀表示进行重定向
 * 3. 不能添加@ResponseBody
 * 4. 重定向资源可以是项目外的转发路径，属于二次请求
 * 5. 如果不使用SpringMVC语法格式 redirect/重定向地址，项目外的返回全路径，项目下的不能忽略Application Context(/springmvc)返回根路径 /springmvc/jsp/index
 * 6. 如果使用 SpringMVC语法格式 redirect/重定向地址，项目下的可以忽略Application Context(/springmvc)，直接返回  /jsp/index
 */

@Controller
@RequestMapping("jsp")
public class JspController {

    // 视图文件
    @GetMapping("index")
    public String index(HttpServletRequest request){
        // 在 request 共享域中添加数据
        request.setAttribute("data","hello jsp!!!");
        System.out.println("JspController.index");
        // 返回视图名， webapp/WEB-INF/index.jsp
        return "index";
    }

    // 转发
    @GetMapping("forward")
    public String forward(){
        System.out.println("JspController.forward");
        return "forward:/jsp/index";
    }

    // 重定向到项目下
    @GetMapping("redirect")
    public String redirect(){
        System.out.println("JspController.redirect");
        return "redirect:/jsp/index";
    }

    // 重定向到项目外
    @GetMapping("redirect/baidu")
    public String redirectBaidu(){
        System.out.println("JspController.redirectBaidu");
        return "redirect:http://www.baidu.com";
    }
}
